package fiado.tela;

import java.awt.Component;
import java.awt.Dimension;
import java.awt.EventQueue;
import java.awt.Font;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.MouseEvent;
import java.awt.event.MouseListener;
import java.text.SimpleDateFormat;
import java.util.List;

import javax.swing.BoxLayout;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JMenu;
import javax.swing.JMenuBar;
import javax.swing.JMenuItem;
import javax.swing.JOptionPane;
import javax.swing.JPanel;
import javax.swing.JScrollPane;
import javax.swing.JTable;
import javax.swing.ListSelectionModel;
import javax.swing.border.EmptyBorder;
import javax.swing.table.DefaultTableModel;

import fiado.bean.Conta;
import fiado.bean.Pessoa;
import fiado.dao.sqlserver.ContaDAO;
import fiado.dao.sqlserver.PessoaDAO;
import fiado.exception.DaoException;
import fiado.tela.pendura.TelaPendura1;
import fiado.tela.pessoa.TelaListaPessoa;
import fiado.tela.produto.TelaListaProduto;
import fiado.util.SwingUtil;
import fiado.util.TelaUtil;

@SuppressWarnings("serial")
public class TelaPrincipal extends JFrame implements ActionListener, MouseListener {

	private JPanel contentPane;
	
	private JMenuBar barraMenu;
	private JMenu menuFiado;
	private JMenu menuPessoa;
	private JMenuItem mnuBuscarPessoa;
	private JMenu menuProduto;
	private JMenuItem mnuBuscarProduto;
	private JMenuItem mnuPendurar;

	private ContaDAO contaDao;
	private PessoaDAO pessoaDao;
	private JLabel lblCenterMessage;
	private JTable table;
	private JScrollPane scrollPane;
	private JPanel centerPanel;
	
	public TelaPrincipal() {
		SwingUtil.tentaSetaNimbus(this);
		this.setTitle("Sistema Fiado");
		
		this.setJMenuBar(getBarraMenu());
		
		//Deixa a tela maximizada
		setExtendedState(JFrame.MAXIMIZED_BOTH);
		setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
		setBounds(100, 100, 789, 859);

		contentPane = new JPanel();
		contentPane.setSize(new Dimension(900, 800));
		contentPane.setBorder(new EmptyBorder(5, 5, 5, 5));
		setContentPane(contentPane);
		contentPane.setLayout(new BoxLayout(contentPane, BoxLayout.Y_AXIS));
		contentPane.add(getLblCenterMessage());
		contentPane.add(getCenterPanel());
		
		//Instancia dao ContaDAO
		this.contaDao = new ContaDAO();
		
		//Instancia dao PessoaDAO
		this.pessoaDao = new PessoaDAO();
		
		try {
			carregarContasPenduradas();
		} catch (DaoException e) {
			JOptionPane.showMessageDialog(this, "Ocorreu um erro ao acessar a base, contate seu fornecedor", "Erro", JOptionPane.ERROR_MESSAGE);
			e.printStackTrace();
			this.dispose();
		}
		
		setVisible(true);
		setResizable(false);
	}

	private void carregarContasPenduradas() throws DaoException {
		//Obtem tabela(TableModel)
		DefaultTableModel tableModel = (DefaultTableModel) this.table.getModel();
		
		tableModel.setRowCount(0);
		
		List<Conta> contasPendurada = this.contaDao.buscarPorStatus(Conta.DEVENDO);

		for (Conta conta : contasPendurada) {
			addRecord(tableModel, conta);
		}
	}
	
	private void addRecord(DefaultTableModel tableModel, Conta conta) throws DaoException {
		Object[] listaObject = new Object[5];//colunas
		int c = 0;
		//Busca o pessoa associado a conta para pegar o nome 
		Pessoa pessoa = this.pessoaDao.buscarPorId(conta.getIdPessoa());
		
		listaObject[c++] = pessoa.getId();
		listaObject[c++] = pessoa.getNomeCompleto();
		listaObject[c++] = conta.getNumConta();
		listaObject[c++] = TelaUtil.formataDinheiro(conta.getTotal());
		listaObject[c++] = new SimpleDateFormat("dd/MM/yyyy").format(conta.getData());
		
		tableModel.addRow(listaObject);
	}
	
	private JMenuBar getBarraMenu() {
		if (this.barraMenu == null) {
			this.barraMenu = new JMenuBar();
			
			this.barraMenu.add(getMenuFiado());
			this.barraMenu.add(getMenuPessoa());
			this.barraMenu.add(getMenuProduto());
		}
		return this.barraMenu;
	}

	private JMenu getMenuProduto() {

		if (this.menuProduto == null) {
			this.menuProduto = new JMenu();
			
			this.menuProduto.setText("Produto");
			
			this.menuProduto.add(getMenuBuscarProduto());
		}
		
		return this.menuProduto;
	}

	private JMenuItem getMenuBuscarProduto() {

		if (this.mnuBuscarProduto == null) {
			this.mnuBuscarProduto = new JMenuItem();
			
			this.mnuBuscarProduto.setText("Buscar Produto");
			
			this.mnuBuscarProduto.addActionListener(this);
		}
		
		return this.mnuBuscarProduto;
	}

	private JMenu getMenuPessoa() {

		if (this.menuPessoa == null) {
			this.menuPessoa = new JMenu();
			
			this.menuPessoa.setText("Pessoa");
			
			this.menuPessoa.add(getMenuBuscarPessoa());
		}
		
		return this.menuPessoa;
	}
	
	private JMenuItem getMenuBuscarPessoa() {

		if (this.mnuBuscarPessoa == null) {
			this.mnuBuscarPessoa = new JMenuItem();
			
			this.mnuBuscarPessoa.setText("Buscar Pessoa");
			
			this.mnuBuscarPessoa.addActionListener(this);
		}
		
		return this.mnuBuscarPessoa;
	}

	private JMenu getMenuFiado() {
		if (this.menuFiado == null) {
			this.menuFiado = new JMenu();
			this.menuFiado.setText("Fiado");
			this.menuFiado.add(getMenuPendurar());
		}
		
		return this.menuFiado;
	}

	private JMenuItem getMenuPendurar() {

		if (this.mnuPendurar == null) {
			this.mnuPendurar = new JMenuItem();
			this.mnuPendurar.setText("Pendurar");
			this.mnuPendurar.addActionListener(this);
		}
		
		return this.mnuPendurar;
	}

	private JLabel getLblCenterMessage() {
		if (lblCenterMessage == null) {
			lblCenterMessage = new JLabel("Lista de contas penduradas");
			lblCenterMessage.setAlignmentX(Component.CENTER_ALIGNMENT);
			lblCenterMessage.setFont(new Font("Dialog", Font.PLAIN, 18));
		}
		return lblCenterMessage;
	}
	private JTable getTable() {
		if (table == null) {
			table = new JTable();
			table.setPreferredScrollableViewportSize(new Dimension(900, 800));
			table.setSize(new Dimension(1000, 800));
			table.setFont(new Font("Dialog", Font.PLAIN, 18));
			table.setSelectionMode(ListSelectionModel.SINGLE_SELECTION);
			table.addMouseListener(this);
			table.setModel(new DefaultTableModel(
				new Object[][] {
					{null, null, null, null, null},
				},
				new String[] {
					"ID", "Nome", "Conta", "Valor", "Data"
				}
			) {
				@SuppressWarnings("rawtypes")
				Class[] columnTypes = new Class[] {
					Integer.class, String.class, Integer.class, String.class, Object.class
				};
				@SuppressWarnings({ "rawtypes", "unchecked" })
				public Class getColumnClass(int columnIndex) {
					return columnTypes[columnIndex];
				}
	        	public boolean isCellEditable(int row,
	                    int column) {
	        		return false;
	        	}
			});
			table.getColumnModel().getColumn(0).setPreferredWidth(80);
			table.getColumnModel().getColumn(1).setPreferredWidth(200);
			table.getColumnModel().getColumn(1).setMinWidth(200);
			table.getColumnModel().getColumn(2).setPreferredWidth(90);
			table.getColumnModel().getColumn(3).setPreferredWidth(100);
			table.getColumnModel().getColumn(4).setPreferredWidth(100);
		}
		return table;
	}
	private JScrollPane getScrollPane() {
		if (scrollPane == null) {
			scrollPane = new JScrollPane();
			scrollPane.setSize(new Dimension(1000, 1000));
			scrollPane.setViewportView(getTable());
		}
		return scrollPane;
	}
	private JPanel getCenterPanel() {
		if (centerPanel == null) {
			centerPanel = new JPanel();
			centerPanel.setSize(new Dimension(1000, 800));
			centerPanel.add(getScrollPane());
		}
		return centerPanel;
	}
	
	@Override
	public void mouseClicked(MouseEvent event) {
		try {
			if (event.getClickCount() == 2) {
					
				int row = table.getSelectedRow();
				DefaultTableModel tableModel = (DefaultTableModel) this.table.getModel();
				int idPessoa = (Integer)tableModel.getValueAt(row, 0);
					
				int numConta = (Integer)tableModel.getValueAt(row, 2);
				
				Conta conta = this.contaDao.buscarPorId(idPessoa, numConta);
				
				new TelaQuitacao(conta);
				
				carregarContasPenduradas();
			}
		} catch (DaoException e) {
			JOptionPane.showMessageDialog(this, "Ocorreu um erro ao acessar a base, contate seu fornecedor", "Erro", JOptionPane.ERROR_MESSAGE);
			e.printStackTrace();
		}
	}

	@Override
	public void actionPerformed(ActionEvent event) {
		try {
			if (event.getSource() == this.mnuBuscarPessoa) {
				//new TelaListaPessoa();
				new TelaListaPessoa();
			} else if (event.getSource() == this.mnuBuscarProduto) {
				//new TelaListaPessoa();
				new TelaListaProduto();
			} else if (event.getSource() == this.mnuPendurar) {
				new TelaPendura1();
			}
			carregarContasPenduradas();
		} catch (DaoException e) {
			JOptionPane.showMessageDialog(this, "Ocorreu um erro ao acessar a base, contate seu fornecedor", "Erro", JOptionPane.ERROR_MESSAGE);
			e.printStackTrace();
		}
	}

	@Override
	public void mousePressed(MouseEvent e) {
	}

	@Override
	public void mouseReleased(MouseEvent e) {
	}

	@Override
	public void mouseEntered(MouseEvent e) {
	}

	@Override
	public void mouseExited(MouseEvent e) {
	}
	
	public static void main(String[] args) {
		EventQueue.invokeLater(new Runnable() {
			public void run() {
				try {
					new TelaPrincipal();
				} catch (Exception e) {
					e.printStackTrace();
				}
			}
		});
	}
}
